home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Freaks Macintosh Archive
/
Freaks Macintosh Archive.bin
/
Freaks Macintosh Archives
/
Ham⁄GPS
/
SoftKiss.src.1.8 Folder
/
SoftKiss.src.1.8
/
(unloved)
/
sfk_prep.c
< prev
next >
Wrap
Text File
|
1992-02-20
|
6KB
|
250 lines
/*
* Routines to handle reading and writing the prep file
* and driver state
*
* by Aaron Wohl (aw0g+@andrew.cmu.edu) jul 1990
* Carnegie-Mellon University
* Special Projects
* Pittsburgh, PA 15213-3890
* (412)-268-5032
*/
#ifdef NYI
#include "sfk_core.h"
#include "sfk_prep.h"
#include "string.h"
#include "sfk_os_preserve.h"
/*
* create the resource fork of a the Prep file
*/
LDEF(void make_pref(void))
{
SysEnvRec info;
short int current_directory;
Str255 vol_name;
int err;
SysEnvirons(1, &info);
GetVol(vol_name,¤t_directory);
SetVol("\p",info.sysVRefNum);
Create(PREP_NAME,0,'sFK0','Prep');
CreateResFile(PREP_NAME);
SetVol("\p",current_directory);
}
/*
* return the resource fork
* return a system error code < 0 if can't open fork
*/
LDEF(int find_res_file(Str255 name,int permission))
{
int result;
int ref_num;
SysEnvRec info;
short int current_directory;
Str255 vol_name;
int err;
SysEnvirons(1, &info);
GetVol(vol_name,¤t_directory);
#ifdef RUBBISH
result=HOpenRF(info.sysVRefNum,0L,name,permission,&ref_num);
if(result>=0)
result=ref_num;
#endif
result=OpenRFPerm(name,info.sysVRefNum,permission);
return result;
}
/*
* get the state contained in the Prep file in the system folder
* returns < 0 on error (a system error code, or -1)
* returns 0 on success
*/
LDEF(long sfk_read_prep_internal(sfk_state_pt s))
{
int old_res_file;
int err=0;
int prep_res;
sfk_state_pt **fhandle;
old_res_file=CurResFile(); /*remember so we can put current resource file back*/
prep_res=find_res_file(PREP_NAME,fsRdPerm); /*open the device driver resource file*/
if(prep_res < 0) /*find the resource file?*/
return prep_res;
fhandle=(sfk_state_pt **)Get1Resource('Prep',PREP_RES_NUM);
if(fhandle==0)
err=ResError();
else
if(GetHandleSize(fhandle)!=sizeof(sfk_state))
err= -1;
else {
memcpy(s,*fhandle,sizeof(*s));
s->sfk_st&= ~MCS_unsaveable; /*don't restore debug state, etc*/
if(s->sfk_st_maj_ver!=sfk_ST_maj_ver)
err= -1;
if(s->sfk_st_min_ver<sfk_ST_min_ver)
err= -1;
if(s->sfk_check_num!=sfk_check_num)
err= -1;
}
CloseResFile(prep_res);
UseResFile(old_res_file); /*go back to the normal resource file*/
return err;
}
int sfk_read_prep(sfk_state_pt s)
{
return OSP_protected_call(OSP_same,sfk_read_prep_internal,s);
}
LDEF(long sfk_write_prep_internal(sfk_state_pt s))
{
int old_res_file;
int err=0;
int prep_res;
sfk_state_pt *fhandle;
old_res_file=CurResFile(); /*remember so we can put current resource file back*/
prep_res=find_res_file(PREP_NAME,fsRdWrPerm); /*open the device driver resource file*/
if(prep_res< 0) {
make_pref();
prep_res=find_res_file(PREP_NAME,fsRdWrPerm); /*open the device driver resource file*/
}
if(prep_res < 0) /*find the resource file?*/
return prep_res;
UseResFile(prep_res); /*may already be open, force to front*/
fhandle=(sfk_state_pt *)Get1Resource('Prep',PREP_RES_NUM);
if(fhandle==0) {
fhandle=(sfk_state_pt *)NewHandle(sizeof(*s));
if(fhandle!=0)
memcpy(*fhandle,s,sizeof(*s));
strcpy((*fhandle)->sfk_text_state,"SavedState");
AddResource(fhandle,'Prep',PREP_RES_NUM,"\p");
err=ResError();
} else {
if(GetHandleSize(fhandle)!=sizeof(sfk_state)) {
asm {
move.l fhandle,a0
move.w #sizeof(sfk_state),d0
_SetHandleSize
move.w d0,err
}
}
if(err==0) {
memcpy(*fhandle,s,sizeof(*s));
strcpy((*fhandle)->sfk_text_state,"SavedState");
ChangedResource(fhandle);
WriteResource(fhandle);
}
}
CloseResFile(prep_res);
UseResFile(old_res_file); /*go back to the normal resource file*/
return err;
}
int sfk_write_prep(sfk_state_pt s)
{
return OSP_protected_call(OSP_same,sfk_write_prep_internal,s);
}
LDEF(char *chooser_name(char *buf))
{
unsigned char **handle;
int len;
handle=(unsigned char**)GetString(-16096);
len=GetHandleSize(handle);
if((handle==0)||(len<=1))
return "no-chooser-name";
if((**handle)>(len-1))
return "bad-chooser-name";
len=imin(sfk_uname_len-1,len);
len=imin(len,**handle);
if(len!=0)
memcpy(buf,(*handle)+1,len);
buf[len]=0;
return buf;
}
int sfk_dont_like_prep(sfk_state_pt s)
{
int result=((s->sfk_st_maj_ver!=sfk_ST_maj_ver)||
(s->sfk_st_min_ver!=sfk_ST_min_ver)||
(s->sfk_check_num!=sfk_check_num));
return result;
}
void sfk_init_state(sfk_state_pt s)
{
memset(s,0,sizeof(*s));
s->sfk_st_maj_ver=sfk_ST_maj_ver;
s->sfk_st_min_ver=sfk_ST_min_ver;
s->sfk_check_num=sfk_check_num;
}
void sfk_invent_state(sfk_state_pt s)
{
char buf[256];
sfk_init_state(s);
s->sfk_remind_time=DEFAULT_REMIND_TIME;
s->sfk_sound_id=DEFAULT_SOUND_ID;
TURN_ON_FLAGS(*s,MCS_want_open|MCS_hearmm|MCS_nsound|MCS_nblink|MCS_npost);
strcpy(s->sfk_uname,chooser_name(buf));
strcpy(s->sfk_text_state,"Default configuration used");
}
int sfk_get_drvr_state(int refnum,sfk_state_pt s)
{
int err;
sfk_io_record ios;
INIT_CPB(ios,refnum,sfk_get_state);
ios.iostate.sfk_st_maj_ver=sfk_ST_maj_ver;
ios.iostate.sfk_st_min_ver=sfk_ST_min_ver;
err=PBControl(&ios,FALSE);
*s=ios.iostate;
return err;
}
sound_res_state sfk_use_sound_res(void)
{
sound_res_state sstate;
sstate.prev_res=CurResFile();
sstate.sound_res=find_res_file("\pMailCheck Sounds",fsRdPerm);
if(sstate.sound_res>0)
UseResFile(sstate.sound_res);
return sstate;
}
void sfk_close_sound_res(sound_res_state sstate)
{
if(sstate.sound_res>0)
CloseResFile(sstate.sound_res);
UseResFile(sstate.prev_res);
}
/*
* set driver state where the sound has possibly changed
*/
int sfk_set_drvr_state_sound_yes(int refnum,sfk_state_pt s,int iokind)
{
sound_res_state cur_res=sfk_use_sound_res();
int err=sfk_set_drvr_state_sound_no(refnum,s,iokind);
sfk_close_sound_res(cur_res);
return err;
}
/*
* set driver state where the sound has not changed
*/
int sfk_set_drvr_state_sound_no(int refnum,sfk_state_pt s,int iokind)
{
int err;
sfk_io_record ios;
ios.iostate=*s;
INIT_CPB(ios,refnum,iokind);
err=PBControl(&ios,FALSE);
*s=ios.iostate;
return err;
}
#endif